# Shared Preference

Shared Preference를 사용하면 비교적 간단한 값을 저장할 수 있습니다. Shared Preference는 파일 형태로 아래 경로에 저장됩니다.

data/data/[pacakge_name]/shared_prefs/[file_name].xml

Shared Preference 파일에 저장된 데이터는 앱이 삭제되기 전까지 유지됩니다.

# Shared Preference 객체 생성하기

Context클래스에는 getSharedPreferences()메소드와 getPreferences()메소드가 선언되어있습니다.

package android.content;

public abstract class Context {
    public abstract SharedPreferences getSharedPreferences(String name, @PreferencesMode int mode);
    public abstract SharedPreferences getSharedPreferences(File file, @PreferencesMode int mode);
}

따라서 Context를 구현한 객체에서는 둘 중 하나의 메서드를 호출하여 새로운 Shared Preference 파일을 생성하거나 기존 파일에 접근할 수 있습니다. 액티비티(Activity)Context클래스를 구현하므로 두 메소드를 호출할 수 있습니다.

# getSharedPreferences()

getSharedPreferences()는 함수의 첫 번째 인자로 전달되는 이름으로 파일을 생성하거나 구분합니다.

private val YOUR_KEY = "your_key"
val sharedPref = activity?.getSharedPreferences(YOUR_KEY, Context.MODE_PRIVATE)

# getPreferences()

액티비티에서 하나의 Shared Preference 파일만 사용해야하는 경우 getPreferences()메서드를 사용합니다. 이 메서드는 액티비티에 포함된 기본 Shared Preference 파일을 자동으로 검색하므로 첫 번째 인자로 파일의 이름을 제공할 필요가 없습니다.

val sharedPreference = activity?.getPreferences(Context.MODE_PRIVATE)

# Shared Prefenreces에 쓰기

SharedPreference의 edit()메소드를 호출하여 Editor객체를 생성합니다.

private val YOUR_KEY = "your_key"
val sharedPref = activity?.getSharedPreferences(YOUR_KEY, Context.MODE_PRIVATE)

val editor = sharedPref.edit()

이제 put○○○()을 호출하여 데이터를 저장할 수 있습니다.

edit.putString("name", "Monica")
edit.putInt("age", 35)
edit.putBoolean("is_married", false)
edit.putFloat("height", 168.3)

마지막으로 commit()을 호출하여 동기화합니다.

edit.commit()

# Shared Prefrences에서 읽기

SharedPreferences객체의 get()를 호출하여 데이터를 읽어올 수 있습니다. 이 때 두 번째 인자로 값이 없을 때의 기본값을 지정합니다.

private val YOUR_KEY = "your_key"
val sharedPref = activity?.getSharedPreferences(YOUR_KEY, Context.MODE_PRIVATE)

val name = sharedPref.getString("name", "")
val age = sharedPref.getInt("age", 0)
val isMarred = sharedPref.getBoolean("is_married", false)
val height = sharedPref.getFloat("height", 0.0)

# Context를 구현하지 않은 클래스

개발을 하다보면 Context클래스를 구현하지 않은 클래스에서도 Shared Preferences에 접근할 필요가 있습니다. 이 때는 Application클래스를 활용할 수 있습니다.

우선 Application클래스를 상속하는 App클래스를 정의합니다.

import android.app.Application

class App: Application() {

    companion object {
        private lateinit var instance: App

        fun newInstance(): App {
            return instance
        }
    }

    override fun onCreate() {
        super.onCreate()
        instance = this
    }
}

AndroidManifest.xml파일에 App클래스를 지정합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yologger.shared_preference">

    <application android:name="com.yologger.shared_preference.App">
            <!-- ... -->
    </application>

</manifest>

이제 다음과 같이 Shared Preferences에 접근할 수 있습니다.

class YourClass {
    private val sharedPreference = App.newInstance().getSharedPreferences("your_file_key", Context.MODE_PRIVATE)
}